﻿using System;
using System.Collections.Generic;
using System.Text;
using Infragistics.Win.UltraWinGrid;
using QLNHK.BLL;
using System.Data;
using QLNHK.Controls;
using Infragistics.Win.UltraWinEditors;
using Infragistics.Win;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Management;
using System.Text.RegularExpressions;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Configuration;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Xml;

namespace QLNHK.BLL
{
    public class cHardware
    {
        public static string GetMotherBoardID()
        {
            string strhdd = string.Empty;
            strhdd = GetHDDSerialNumber("C");
            strhdd += GetProcessorId();
            //MACAddress = MACAddress.Replace(":", "");
            if (strhdd.Length <= 0)
                strhdd = System.Environment.MachineName.Trim();
            return CatChuoi(strhdd.ToString());

        }
        private static string GetHDDSerialNumber(string drive)
        {
            //check to see if the user provided a drive letter
            //if not default it to "C"
            if (drive == "" || drive == null)
            {
                drive = "C";
            }
            //create our ManagementObject, passing it the drive letter to the
            //DevideID using WQL
            ManagementObject disk = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");
            //bind our management object
            disk.Get();
            //return the serial number
            return disk["VolumeSerialNumber"].ToString();
        }
        public static string GetProcessorId()
        {
            string strProcessorId = string.Empty;
            SelectQuery query = new SelectQuery("Win32_processor");
            ManagementObjectSearcher search = new ManagementObjectSearcher(query);

            foreach (ManagementObject info in search.Get())
            {
                strProcessorId = info["processorId"].ToString();
            }

            return strProcessorId;
        }
        private static string ClearString(string fileName)
        {

            string result = fileName;

            try
            {
                string pattern = @"([{}\(\)\^$&._%#!@=<>:;,~`'\’ \*\?\/\+\|\[\\\\]|\]|\-)"; //"^(a-z|A-Z|0-9)*[^#$%^&*()']*$";

                result = new Regex(pattern).Replace(fileName, "_");
            }
            catch (Exception ex) { }

            return result;

        }

        private static string CatChuoi(string str)
        {
            int _lenghtMotherBoardID = 10;
            str = ClearString(str).Replace("_", "");
            if (str.Length > _lenghtMotherBoardID)
                return str.Substring(0, _lenghtMotherBoardID);
            else
            {
                for (int i = 0; i >= _lenghtMotherBoardID - str.Length; i++)
                {
                    str += "0";
                }
                return str;
            }
        }
    }
    public enum ETinhTrang
    {
        DangCuTru = 0,
        DaChuyenDi = 1,
        DaCatKhau = 2,
        DaMat = 3
    }

    public enum EDiaBanGayAn
    {
        TaiDiaPhuong = 100,
        LuuDongTrenTuyen = 101,
        BoNoiCuTruDenCacThanhPhoHoatDong = 103
    }

    public enum EPhamViHoatDong
    {
        LienTinh = 201,
        LienQuan = 202,
        LienXa = 203,
        TaiNoiCutru = 204
    }

    public struct DBConnectionString
    {
        public string Server;
        public string Database;
        public string User;
        public string Pass;

        public string Prefix;
        public string Suffix;
        public bool IsAttachDbFilename;
    }

    public class Global
    {
        public static string DATE_FORMAT = "dd/MM/yyyy";
        //public static int DIABAN_THANHPHO = 48; //Da nang
        public static int CACHE_THANHPHO_ID;
        public static int CACHE_QUANHUYEN_ID;
        public static int CACHE_XAPHUONG_ID;
        public static int CACHE_TODANPHO_ID;

        public static DBConnectionString DB_CONNECTION = new DBConnectionString();
        public const string DATABASE_INSTANCE_DEFAULT = ".\\QLNKEXpress";
        public const string DATABASE_NAME_DEFAULT = "QLNHK";
        public const string DATABASE_USER_DEFAULT = "sa";
        public const string DATABASE_PASS_DEFAULT = "123456";

        public static string PATH_DRIVER_NAME = "D:\\";
        public static string PATH_MANUFACTOR_NAME = "VANLUAT";
        public static string PATH_APPLICATION_NAME = PATH_MANUFACTOR_NAME + "\\QuanLyNhanHoKhau";
        public static string PATH_FOLDER_DATABASE = PATH_MANUFACTOR_NAME + "\\DataBase";
        public static string PATH_FOLDER_DATABASE_BACKUP = PATH_FOLDER_DATABASE + "\\Backup";
        public static int TIME_BACKUP = 5; //5 phut
        public static string APPLICATION_NAME = "QLNHK";

        public Global() { }

        public static void setDataToComboThanhPho(UltraCombo cbo, bool optionNull)
        {
            DataTable dtDataSource = ThanhPho.SelectDynamic("1=1", "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            if (optionNull)
            {
                DataRow dr = dtDataSource.NewRow();
                dr["ID"] = "0";
                dr["Ten"] = "-";
                dtDataSource.Rows.InsertAt(dr, 0);
            }

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboThanhPho(UltraCombo cbo)
        {
            DataTable dtDataSource = ThanhPho.SelectDynamic("1=1", "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            DataRow dr = dtDataSource.NewRow();
            dr["ID"] = "0";
            dr["Ten"] = "-";
            dtDataSource.Rows.InsertAt(dr, 0);

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboQuanHuyen(UltraCombo cbo, int IDThanhPho, bool optionNull)
        {
            DataTable dtDataSource = QuanHuyen.SelectDynamic("IDThanhPho=" + IDThanhPho, "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            if (optionNull)
            {
                DataRow dr = dtDataSource.NewRow();
                dr["ID"] = "0";
                dr["Ten"] = "-";
                dtDataSource.Rows.InsertAt(dr, 0);
            }
            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboQuanHuyen(UltraCombo cbo, int IDThanhPho)
        {
            DataTable dtDataSource = QuanHuyen.SelectDynamic("IDThanhPho=" + IDThanhPho, "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            DataRow dr = dtDataSource.NewRow();
            dr["ID"] = "0";
            dr["Ten"] = "-";
            dtDataSource.Rows.InsertAt(dr, 0);

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboXaPhuong(UltraCombo cbo, int IDQuanHuyen, bool optionNull)
        {
            DataTable dtDataSource = XaPhuong.SelectDynamic("IDQuanHuyen=" + IDQuanHuyen, "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            if (optionNull)
            {
                DataRow dr = dtDataSource.NewRow();
                dr["ID"] = "0";
                dr["Ten"] = "-";
                dtDataSource.Rows.InsertAt(dr, 0);
            }

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboXaPhuong(UltraCombo cbo, int IDQuanHuyen)
        {
            DataTable dtDataSource = XaPhuong.SelectDynamic("IDQuanHuyen=" + IDQuanHuyen, "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            DataRow dr = dtDataSource.NewRow();
            dr["ID"] = "0";
            dr["Ten"] = "-";
            dtDataSource.Rows.InsertAt(dr, 0);

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }
        public static void setDataToComboToDanPho(UltraCombo cbo, int IDXaPhuong)
        {
            DataTable dtDataSource = ToDanPho.SelectDynamic("IDPhuongXa=" + IDXaPhuong, "Ten ASC").Tables[0];
            cbo.DataSource = dtDataSource;

            DataRow dr = dtDataSource.NewRow();
            dr["ID"] = "0";
            dr["Ten"] = "-";
            dtDataSource.Rows.InsertAt(dr, 0);

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;

        }

        public static void setDataToComboNhomNguoiDung(UltraCombo comboControl)
        {
            Cls_NHOM_NGUOIDUNG ObjNhomNguoiDung = new Cls_NHOM_NGUOIDUNG();
            DataSet ds = new DataSet();
            ds = ObjNhomNguoiDung.ListByAll();
            comboControl.DataSource = ds;
            comboControl.DisplayMember = "Ten";
            comboControl.ValueMember = "ID_Nhom_NguoiDung";
            comboControl.DisplayLayout.AutoFitStyle = Infragistics.Win.UltraWinGrid.AutoFitStyle.ResizeAllColumns;
            UltraGridBand ugGridBand = comboControl.DisplayLayout.Bands[0];
            ugGridBand.Columns["Ten"].Header.Caption = "Tên nhóm";
            ugGridBand.Columns["Mota"].Hidden = true;
            ugGridBand.Columns["ID_Nhom_NguoiDung"].Hidden = true;
            ugGridBand.Columns["Ten"].SortIndicator = SortIndicator.Ascending;
            UltraComboControls.SetComboStyle(comboControl);
        }
        public static void setDataToComboNguoiDung(UltraCombo comboControl)
        {
            Cls_NGUOIDUNG ObjNhomNguoiDung = new Cls_NGUOIDUNG();
            DataTable dtDataSource = ObjNhomNguoiDung.ListByAll().Tables[0];
            comboControl.DataSource = dtDataSource;

            comboControl.DisplayMember = "Ten_NguoiDung";
            comboControl.ValueMember = "ID_NguoiDung";

            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                comboControl.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }

            comboControl.DisplayLayout.AutoFitStyle = Infragistics.Win.UltraWinGrid.AutoFitStyle.ResizeAllColumns;
            UltraGridBand ugGridBand = comboControl.DisplayLayout.Bands[0];
            ugGridBand.Columns["Ten_NguoiDung"].Header.Caption = "Tên người dùng";
            ugGridBand.Columns["Ten_NguoiDung"].Hidden = false;
            ugGridBand.Columns["Ten"].SortIndicator = SortIndicator.Ascending;
        }
        public static void setDataToComboNgaySinh(UltraComboEditor comboControl)
        {
            try
            {
                comboControl.Items.Clear();

                comboControl.Items.Add(0, "--");

                for (int i = 1; i <= 31; i++)
                {
                    comboControl.Items.Add(i, i.ToString("00"));
                }

                comboControl.SelectedIndex = 0;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        public static void setDataToComboThangSinh(UltraComboEditor comboControl)
        {
            try
            {
                comboControl.Items.Clear();

                comboControl.Items.Add(0, "--");

                for (int i = 1; i <= 12; i++)
                {
                    comboControl.Items.Add(i, i.ToString("00"));
                }

                comboControl.SelectedIndex = 0;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        public static void setDataToComboNamSinh(UltraComboEditor comboControl)
        {
            try
            {
                comboControl.Items.Clear();

                comboControl.Items.Add(0, "--");

                int namHienTai = System.DateTime.Now.Year;

                for (int i = namHienTai; i >= 1975; i--)
                {
                    comboControl.Items.Add(i, i.ToString("0000"));
                }

                comboControl.SelectedIndex = 0;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }
        public static void setDataToComboDanhMuc(UltraCombo cbo, string catalogueDM)
        {
            DataTable dtDataSource = DM_DanToc.SelectDynamic("1=1", "Ten ASC").Tables[0];

            switch (catalogueDM)
            {
                case DMCatalogue.DM_DANTOC:
                    dtDataSource = DM_DanToc.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_TONGIAO:
                    dtDataSource = DM_TonGiao.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_QUOCTICH:
                    dtDataSource = DM_QuocTich.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_QUANHE_GIADINH:
                    dtDataSource = DM_QuanHeGiaDinh.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;

                case DMCatalogue.DM_TRINHDO_HOCVAN:
                    dtDataSource = DM_TrinhDoHocVan.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_TRINHDO_CHUYENMON:
                    dtDataSource = DM_TrinhDoChuyenMon.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_TRINHDO_NGOAINGU:
                    dtDataSource = DM_TrinhDoNgoaiNgu.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;

                case DMCatalogue.DM_LOAIHOKHAU:
                    dtDataSource = DM_LoaiHoKhau.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;

                case DMCatalogue.DM_LOAIDOITUONG:
                    dtDataSource = DoiTuong_PhanLoai.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_HEDOITUONG:
                    dtDataSource = DoiTuong_He.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
                case DMCatalogue.DM_DANHMUCDOITUONG:
                    dtDataSource = DoiTuong_DanhMuc.SelectDynamic("1=1", "Ten ASC").Tables[0];
                    break;
            }

            cbo.DataSource = dtDataSource;

            DataRow dr = dtDataSource.NewRow();
            dr["ID"] = "0";
            dr["Ten"] = "-";
            dtDataSource.Rows.InsertAt(dr, 0);

            cbo.DisplayMember = "Ten";
            cbo.ValueMember = "ID";
            //Ẩn hết các cột
            foreach (DataColumn col in dtDataSource.Columns)
            {
                cbo.DisplayLayout.Bands[0].Columns[col.ColumnName].Hidden = true;
            }
            //Setting để hiển thị cột cần thiết
            cbo.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Hidden = false;
            cbo.DisplayLayout.Bands[0].Columns["Ten"].Header.Caption = "Tên";
            cbo.Rows[0].Selected = true;
        }
        public static void setDataToComboTinhTrang(UltraComboEditor comboControl, bool includeAll)
        {
            try
            {
                comboControl.Items.Clear();
                if (includeAll)
                    comboControl.Items.Add(-1, "--");
                comboControl.Items.Add((int)ETinhTrang.DangCuTru, "Đang cư trú");
                comboControl.Items.Add((int)ETinhTrang.DaChuyenDi, "Đã chuyển đi");
                comboControl.Items.Add((int)ETinhTrang.DaCatKhau, "Đã cắt khẩu");
                comboControl.Items.Add((int)ETinhTrang.DaMat, "Đã mất");

                comboControl.SelectedIndex = 0;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }
        }

        public static ValueList getValueListGioiTinh()
        {
            ValueList vlValue = new ValueList();
            vlValue.ValueListItems.Add(1, "Nam");
            vlValue.ValueListItems.Add(0, "Nữ");
            vlValue.ValueListItems.Add(2, "Không xác định");
            return vlValue;
        }
        public static ValueList getValueListTinhTrang()
        {
            ValueList vlValue = new ValueList();
            vlValue.ValueListItems.Add((int)ETinhTrang.DangCuTru, "Đang cư trú");
            vlValue.ValueListItems.Add((int)ETinhTrang.DaChuyenDi, "Đã chuyển đi");
            vlValue.ValueListItems.Add((int)ETinhTrang.DaCatKhau, "Đã cắt khẩu");
            vlValue.ValueListItems.Add((int)ETinhTrang.DaMat, "Đã mất");
            return vlValue;
        }
        public static ValueList getValueListDanhMuc(string catalogueDM)
        {
            ValueList vlValue = new ValueList();
            try
            {
                DataTable dtDataSource = DM_DanToc.SelectDynamic("1=1", "Ten ASC").Tables[0];

                switch (catalogueDM)
                {
                    case DMCatalogue.DM_DANTOC:
                        dtDataSource = DM_DanToc.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_TONGIAO:
                        dtDataSource = DM_TonGiao.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_QUOCTICH:
                        dtDataSource = DM_QuocTich.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_QUANHE_GIADINH:
                        dtDataSource = DM_QuanHeGiaDinh.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;

                    case DMCatalogue.DM_TRINHDO_HOCVAN:
                        dtDataSource = DM_TrinhDoHocVan.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_TRINHDO_CHUYENMON:
                        dtDataSource = DM_TrinhDoChuyenMon.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_TRINHDO_NGOAINGU:
                        dtDataSource = DM_TrinhDoNgoaiNgu.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;

                    case DMCatalogue.DM_LOAIHOKHAU:
                        dtDataSource = DM_LoaiHoKhau.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;

                    case DMCatalogue.DM_LOAIDOITUONG:
                        dtDataSource = DoiTuong_PhanLoai.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_HEDOITUONG:
                        dtDataSource = DoiTuong_He.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                    case DMCatalogue.DM_DANHMUCDOITUONG:
                        dtDataSource = DoiTuong_DanhMuc.SelectDynamic("1=1", "Ten ASC").Tables[0];
                        break;
                }

                DataRow dr = dtDataSource.NewRow();
                dr["ID"] = "0";
                dr["Ten"] = "-";
                dtDataSource.Rows.InsertAt(dr, 0);

                for (int i = 0; i < dtDataSource.Rows.Count; i++)
                {
                    vlValue.ValueListItems.Add(System.Convert.ToInt32(dtDataSource.Rows[i]["ID"]), dtDataSource.Rows[i]["Ten"].ToString());
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }

            return vlValue;
        }
        public static ValueList getValueListNguoiDung()
        {
            Cls_NGUOIDUNG ObjNhomNguoiDung = new Cls_NGUOIDUNG();
            DataTable dtDataSource = ObjNhomNguoiDung.ListByAll().Tables[0];

            ValueList vlValue = new ValueList();
            for (int i = 0; i < dtDataSource.Rows.Count; i++)
            {
                vlValue.ValueListItems.Add(System.Convert.ToInt32(dtDataSource.Rows[i]["ID_NguoiDung"]), dtDataSource.Rows[i]["Ten_NguoiDung"].ToString());
            }
            return vlValue;
        }

        public static string GetRole(string[] roleFunction)
        {
            string result = null;
            string[] arrRole = new string[5];
            arrRole[0] = "0";
            arrRole[1] = "0";
            arrRole[2] = "0";
            arrRole[3] = "0";
            arrRole[4] = "0";
            foreach (string role in roleFunction)
            {
                for (int i = 0; i < 5; i++)
                {
                    if (role.Substring(i, 1).Equals("1"))
                    {
                        arrRole[i] = role.Substring(i, 1);
                    }
                }
            }

            foreach (string arr in arrRole)
            {
                result += arr;
            }
            return result;
        }
        public static string Encrypt(string strToEncrypt)
        {
            System.Text.UTF8Encoding ue = new System.Text.UTF8Encoding();
            byte[] bytes = ue.GetBytes(strToEncrypt);

            // encrypt bytes
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] hashBytes = md5.ComputeHash(bytes);

            // Convert the encrypted bytes back to a string (base 16)
            string hashString = "";

            for (int i = 0; i < hashBytes.Length; i++)
            {
                hashString += Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
            }

            return hashString.PadLeft(32, '0');
        }

        public static byte[] ImageToByteArray(System.Drawing.Image imageIn, ImageFormat format)
        {
            using (var ms = new MemoryStream())
            {
                if (format == ImageFormat.Jpeg)
                    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                else if (format == ImageFormat.Png)
                    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

                return ms.ToArray();
            }
        }
        public static Image ByteArrayToImage(byte[] byteArrayIn)
        {
            using (var ms = new MemoryStream(byteArrayIn))
            {
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
        }

        public static void SaoChep(object S, object T)
        {
            foreach (var pS in S.GetType().GetProperties())
            {
                foreach (var pT in T.GetType().GetProperties())
                {
                    if (pT.Name != pS.Name) continue;
                    (pT.GetSetMethod()).Invoke(T, new object[] { pS.GetGetMethod().Invoke(S, null) });
                }
            };
        }

        public static DBConnectionString ReadNodeXmlDBConnectionStrings(string key)
        {
            DBConnectionString con = new DBConnectionString();

            try
            {
                string connectionString = ReadNodeXmlConnectionStrings(key);

                string[] arr = connectionString.Split(new char[] { ';' });

                if (connectionString.Contains("AttachDbFilename"))
                {
                    for (int i = 0; i < arr.Length; i++)
                    {
                        if (arr[i].ToLower().Contains("data source"))
                            con.Server = arr[i].Split(new char[] { '=' })[1];
                        else if (arr[i].ToLower().Contains("database"))
                            con.Database = arr[i].Split(new char[] { '=' })[1];
                    }

                    con.User = "sa";
                    con.Pass = "123456";
                    con.IsAttachDbFilename = true;
                }
                else
                {
                    for (int i = 0; i < arr.Length; i++)
                    {
                        if (arr[i].ToLower().Contains("server"))
                            con.Server = arr[i].Split(new char[] { '=' })[1];
                        else if (arr[i].ToLower().Contains("database"))
                            con.Database = arr[i].Split(new char[] { '=' })[1];
                        else if (arr[i].ToLower().Contains("uid") || arr[i].ToLower().Contains("user"))
                            con.User = arr[i].Split(new char[] { '=' })[1];
                        else if (arr[i].ToLower().Contains("pwd") || arr[i].ToLower().Contains("pass"))
                            con.Pass = arr[i].Split(new char[] { '=' })[1];
                    }
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(key, ex); }

            return con;
        }
        public static string ReadNodeXmlConnectionStrings(string key)
        {
            try
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                string connectionString = config.ConnectionStrings.ConnectionStrings[key].ConnectionString;

                return connectionString;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(key, ex); }

            return "";
        }
        public static void SaveNodeXmlAppSettings(string key, object value)
        {
            try
            {
                System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
                System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
                doc.Load(config.FilePath);
                string groupSettingName = "appSettings";

                SaveNodeXml(config, doc, groupSettingName, key, value);
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(key, ex); }
        }
        public static void SaveNodeXml(System.Configuration.Configuration config, System.Xml.XmlDocument xmlDocument, string groupSettingName, string key, object value)
        {
            try
            {
                xmlDocument.SelectSingleNode("//" + groupSettingName + "//add[@key='" + key + "']").SelectSingleNode("@value").Value = value.ToString();
                xmlDocument.Save(config.FilePath);
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(key, ex);
                AddNodeConfig(key, value.ToString());
            }
        }
        public static void AddNodeConfig(string key, string ValueDefault)
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.AppSettings.Settings.Add(key, ValueDefault);
            config.Save();
        }

        /// <summary>
        /// Tao cau truc thu muc chuong trinh
        /// </summary>
        /// <returns></returns>
        public static bool CreateFolderDatabaseStructure()
        {
            //Tao mac dinh thu muc sao luu du lieu
            try
            {
                /******************************************************************
                //1. Tạo thư mục lưu data (Nếu chưa có): [Ổ đĩa]/[Ten nha cung cap]/[Thư mục chương trình]/Database 
                //2. Kiểm tra tên file data, tên file log vật lý tại thư mục lưu dữ liệu có trùng tên trước khi copy.
                //   Nếu đã có thì cảnh báo và không thực hiện copy file.
                //3. Copy file du lieu từ [Thư mục chương trình]\DATA den vi tri thư mục mới: [Ổ đĩa]/[Ten nha cung cap]/Thư mục chương trình/Database
                //4. Lấy thông tin đường dẫn mới của file data.
                *******************************************************************/

                Global.PATH_DRIVER_NAME = GetDriverNameOffFileExecute();

                CommonApplicationData direc = null;
                //1. Tao thu muc: [Ổ đĩa]/[Ten nha cung cap]
                if (!System.IO.Directory.Exists(Global.PATH_DRIVER_NAME + Global.PATH_MANUFACTOR_NAME))
                    direc = new CommonApplicationData(Global.PATH_DRIVER_NAME + Global.PATH_MANUFACTOR_NAME, "", true);
                //2. va [Ổ đĩa]/[Ten nha cung cap]/[Thư mục chương trình]
                if (!System.IO.Directory.Exists(Global.PATH_DRIVER_NAME + Global.PATH_APPLICATION_NAME))
                    direc = new CommonApplicationData(Global.PATH_DRIVER_NAME + Global.PATH_APPLICATION_NAME, "", true);
                //3. va [Ổ đĩa]/[Ten nha cung cap]/[Thư mục chương trình]/Database 
                if (!System.IO.Directory.Exists(Global.PATH_DRIVER_NAME + Global.PATH_FOLDER_DATABASE))
                    direc = new CommonApplicationData(Global.PATH_DRIVER_NAME + Global.PATH_FOLDER_DATABASE, "", true);
                //4. va [Ổ đĩa]/[Ten nha cung cap]/[Thư mục chương trình]/Database/Backup 
                if (!System.IO.Directory.Exists(Global.PATH_DRIVER_NAME + Global.PATH_FOLDER_DATABASE_BACKUP))
                    direc = new CommonApplicationData(Global.PATH_DRIVER_NAME + Global.PATH_FOLDER_DATABASE_BACKUP, "", true);

                return true;
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
            }

            return false;
        }
        /// <summary>
        /// Lay ten o dia chua thu muc chuong trinh
        /// </summary>
        /// <returns></returns>
        public static string GetDriverNameOffFileExecute()
        {
            try
            {
                string driverName = System.IO.Directory.GetDirectoryRoot(AppDomain.CurrentDomain.BaseDirectory);

                return driverName;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }

            return "";
        }
        /// <summary>
        /// Thay doi ten file, tu dong kiem tra ten va them so thu tu tang dan vao ten file 
        /// </summary>
        /// <param name="originalFileName"></param>
        /// <returns></returns>
        public static string ChangeFileName(string originalFileName)
        {
            try
            {
                System.IO.FileInfo fi = new FileInfo(originalFileName);

                int cnt = 0;
                string newName = "";
                bool valid = System.IO.File.Exists(fi.FullName);

                while (valid)
                {
                    cnt += 1;
                    newName = fi.DirectoryName + "\\" + string.Format("{0}_{1}", fi.Name.Replace(fi.Extension, ""), cnt.ToString("00") + fi.Extension);
                    valid = System.IO.File.Exists(newName);
                }

                return newName;
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); }

            return originalFileName;
        }
    }

    public class DMCatalogue
    {
        public const string DM_QUOCTICH = "mnuDMQuocTich";
        public const string DM_DANTOC = "mnuDMDanToc";
        public const string DM_TONGIAO = "mnuDMTonGiao";
        public const string DM_QUANHE_GIADINH = "mnuDMQuanHeGiaDinh";

        public const string DM_TRINHDO_CHUYENMON = "mnuDMTrinhDoChuyenMon";
        public const string DM_TRINHDO_HOCVAN = "mnuDMTrinhDoHocVan";
        public const string DM_TRINHDO_NGOAINGU = "mnuDMTrinhDoNgoaiNgu";

        public const string DM_LOAIHOKHAU = "mnuDMLoaiHo";

        public const string DM_LOAIDOITUONG = "mnuDMPhanLoaiDoiTuong";
        public const string DM_HEDOITUONG = "mnuDMHeDoiTuong";
        public const string DM_DANHMUCDOITUONG = "mnuDMDanhMucDoiTuong";
    }

    public class ThongBao
    {
        public const string APPLICATION_ERROR_0Param = "Có lỗi trong quá trình xử lý thông tin";
        public const string APPLICATION_ERROR_01Param = "Có lỗi trong quá trình xử lý thông tin:\r\n{0}";
        public const string APPLICATION_ERROR_03Param = "Có lỗi trong quá trình xử lý thông tin. Xin vui lòng liên hệ nhà cung cấp để được hướng dẫn.\r\n\nThông tin liên hệ:\r\n-Người liên hệ: {0}\r\n-Điện thoại: {1}\r\n-Email: {2}";
        public const string APPLICATION_ERROR_LOADING_01Param = "Có lỗi trong quá trình tải dữ liệu:\r\n{0}";

        public const string APPLICATION_NOT_CONNECT_INTERNET_0Param = "Không kết nối được dữ liệu.\r\n\nXin vui lòng liên hệ nhà cung cấp để được hướng dẫn.";

        public const string APPLICATION_SEND_EMAIL_SUCCESS_0Param = "Cảm ơn bạn đã gửi thông tin đến chúng tôi.\r\nChúng tôi sẽ sớm trả lời bạn trong thời gian nhanh nhất";
        public const string APPLICATION_SEND_EMAIL_FAIL_03Param = "Hệ thống không thể gửi email lỗi của bạn.\r\n\nXin vui lòng liên hệ nhà cung cấp để được hướng dẫn.\r\n\nThông tin liên hệ:\r\n- Người liên hệ: {0}\r\n- Điện thoại: {1}\r\n- Email: {2}";
        public const string APPLICATION_SEND_EMAIL_ERROR_03Param = "Xảy ra lỗi khi gởi thông tin lỗi tới nhà cung cấp phần mềm.\r\n\nXin vui lòng liên hệ nhà cung cấp để được hướng dẫn.\r\n\nThông tin liên hệ:\r\n- Người liên hệ: {0}\r\n- Điện thoại: {1}\r\n- Email: {2}";

        public const string APPLICATION_SAVE_DATA_SUCCESS_0Param = "Lưu thông tin thành công.";
        public const string APPLICATION_SAVE_DATA_FAIL_0Param = "Lưu thông tin thất bại.";
        /// <summary>
        /// Thông báo gửi email đăng ký dùng thử phần mềm: 4 tham số: Tên công ty, Địa chỉ, Điện thoại, Email
        /// </summary>
        public const string APPLICATION_SEND_EMAIL_REGISTER_TRIAL_CHECK_4Param = " Cám ơn bạn đã đăng ký dùng thử nghiệm với chúng tôi. Vui lòng kiểm tra hộp thư để nhận CD Key.\r\n Mọi chi tiết xin liên hệ:\r\n\t- {0}\r\n\t- Địa chỉ: {1}\r\n\t- Điện thoại: {2}\r\n\t- Email: {3}";
        public const string APPLICATION_SEND_EMAIL_REGISTER_TRIAL_FAIL_4Param = " Không thể gửi thông tin đăng ký, xin kiểm tra lại kết nối mạng (hoặc có thể bị chặn bởi Firewall hoặc AntiVirus)\r\n\r\n-----------------------------------------------------------------\r\n Nếu không thể gửi thông tin lại, bạn có thể gửi email liên lạc đến địa chỉ:\r\n\t- {0}\r\n\t- Địa chỉ: {1}\r\n\t- Điện thoại: {2}\r\n\t- Email: {3}";
        public const string APPLICATION_SEND_EMAIL_REGISTER_TRIAL_SUCCESS_4Param = " Cám ơn bạn đã gửi thông tin đăng ký đến chúng tôi.\r\n Tối đa trong vòng 24h tới chúng tôi sẽ gửi CD key kích hoạt đến Email đăng ký của bạn. Xin vui lòng kiểm tra hộp thư.\r\n Cảm ơn bạn đã quan tâm sử dụng chương trình.\r\n\r\n-----------------------------------------------------------------\r\n Mọi chi tiết xin liên hệ:\r\n\t- {0}\r\n\t- Địa chỉ: {1}\r\n\t- Điện thoại: {2}\r\n\t- Email: {3}";

        public const string APPLICATION_ACTIVE_LICENSE_4Param = "Thông tin chi tiết xin liên hệ:\r\n\t- {0}\r\n\t- Địa chỉ: {1}\r\n\t- Điện thoại: {2}\r\n\t- Email: {3}";
        public const string APPLICATION_EXPIRE_LICENSE_5Param = "Phần mềm còn '{0}' ngày nữa là hết hạn sử dụng.\nVui lòng liên hệ với nhà cung cấp để tiếp tục sử dụng và được hỗ trợ, nâng cấp phần mềm mới nhất.\r\n\n Mọi chi tiết xin liên hệ:\r\n\t- {1}\r\n\t- Địa chỉ: {2}\r\n\t- Điện thoại: {3}\r\n\t- Email: {4}";
        public const string APPLICATION_NOT_REGISTER_LICENSE_4Param = "Bạn chưa đăng ký sử dụng phần mềm.\nVui lòng liên hệ với nhà cung cấp để tiếp tục sử dụng và được hỗ trợ, nâng cấp phần mềm mới nhất.\r\n\n Mọi chi tiết xin liên hệ:\r\n\t- {0}\r\n\t- Địa chỉ: {1}\r\n\t- Điện thoại: {2}\r\n\t- Email: {3}";

        public const string MSG_Warning_FrmDanhSachNguoiDung_DeleteData = "Bạn có chắc là muốn xóa người dùng {0} không ?\nChọn Yes để xoá hoặc chọn No để quay lại";
        public const string MSG_Warning_FrmDanhSachNomNguoiDung_NhomIsAdminGroup = "Nhóm Admin không được phép xóa.";
        public const string MSG_Warning_FrmDanhSachNomNguoiDung_NhomNguoiDungIsExistsNguoiDung = "Đã tồn tại người dùng trong nhóm. \n Không thể xóa nhóm {0}.";
        public const string MSG_Warning_FrmDSNguoiDung_KoChoXoa = "Không được phép xóa người dùng này.";
        public const string MSG_Warning_FrmDSNguoiDungNull = "Không có người dùng nào tồn tại trong hệ thống";
        public const string MSG_Caption = "Thông báo.";
        public const string MSG_Caption_Error = "Thông báo lỗi.";
        public const string MSG_Caption_Warning = "Xác nhận thông tin.";
        public const string MSG_Warring_SaveData = "Quá trình làm việc chưa lưu. Bạn có muốn lưu không?";
        public const string MSG_Warring_SaveData_Error = "Dữ liệu không hợp lệ !\nĐề nghị kiểm tra thông tin trước khi lưu hoặc bấm nút HỦY để trở lại trạng thái ban đầu.";
        public const string MSG_Warning_FrmTaoNguoiDung_LoiXoaNguoiDung = "Lỗi xóa người dùng.";
        public const string MSG_Warning_FrmTaoNguoiDung_TenNguoiDung = "Tên người dùng không được rỗng";
        public const string MSG_Warning_FrmTaoNguoiDung_TenNhanSu = "Tên nhân sự không được rỗng";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_LoiChinhSuaNhom = "Lỗi chỉnh sửa nhóm.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_LoiLayDanhSachNguoiDungDuocChon = "Lỗi lấy danh sách người dùng được chọn.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_LoiTaoNhom = "Lỗi tạo mới nhóm.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_LoiThemNguoiDungVaoNhom = "Lỗi thêm người dùng vào nhóm.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_LoiXoaNhom = "Lỗi xóa nhóm.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_TenNhomIsExists = "Tên nhóm {0} đã tồn tại. \nNhập lại tên khác.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_TenNhomIsNull = "Nhập tên cho nhóm người dùng.";
        public const string MSG_Warning_FrmTaoNhomNguoiDung_XoaNhom = "Bạn có chắc là muốn xóa nhóm người dùng {0} không ?\nChọn Yes để xoá hoặc chọn No để quay lại";
        public const string MSG_Warning_FrmTaoNguoiDung_ThemNguoiDung = "Có lỗi trong quá trình thêm mới người dùng.";
        public const string MSG_Error_DatabaseAll = "Lỗi : {0}. \nKhông thể cập nhật CSDL!";
        public const string MSG_Error_DatabaseAll_NoArgs = "Lỗi : Không thể cập nhật CSDL!";
        public const string MSG_Warning_FrmMatKhauLogin = "Mật khẩu không được rỗng";
        public const string MSG_Warning_FrmMatKhauQuaNgan = "Mật khẩu phải nhiều hơn 6 ký tự";
        public const string MSG_Warning_FrmMatKhauTrungKhop = "Mật khẩu chưa trùng khớp";
    }

    public class Validations_Infragistics
    {
        /* INFRAGISTICS */
        /// <summary>
        /// Kiểm tra thông tin rỗng.
        /// </summary>
        /// <param name="txtControl"></param>
        /// <param name="err"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public static bool ValidateNull(Infragistics.Win.UltraWinEditors.UltraTextEditor textBoxControl, System.Windows.Forms.ErrorProvider err, string fieldName)
        {
            bool isValid = true;
            string msgErr = "Thông tin '" + fieldName + "' không được để trống.";

            err.SetError(textBoxControl, "");

            if (textBoxControl.Text.Trim().Length == 0)
            {
                isValid = false;
                err.SetError(textBoxControl, msgErr);
                textBoxControl.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// Kiểm tra thông tin rỗng.
        /// </summary>
        /// <param name="txtControl"></param>
        /// <param name="err"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public static bool ValidateNull(Infragistics.Win.UltraWinEditors.UltraDateTimeEditor dateTimeControl, System.Windows.Forms.ErrorProvider err, string fieldName)
        {
            bool isValid = true;
            string msgErr = "Thông tin '" + fieldName + "' không được để trống.";

            err.SetError(dateTimeControl, "");

            if (Convert.ToDateTime(dateTimeControl.Value).Year <= 1900)
            {
                isValid = false;
                err.SetError(dateTimeControl, msgErr);
                dateTimeControl.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// Kiểm tra thông tin rỗng.
        /// </summary>
        /// <param name="txtControl"></param>
        /// <param name="err"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public static bool ValidateChoose(Infragistics.Win.UltraWinGrid.UltraCombo comboBoxControl, System.Windows.Forms.ErrorProvider err, string fieldName)
        {
            bool isValid = true;
            string msgErr = "Chưa chọn thông tin '" + fieldName + "'.";

            err.SetError(comboBoxControl, "");

            if (comboBoxControl.SelectedRow == null || (comboBoxControl.Value != null && System.Convert.ToInt32(comboBoxControl.Value) == 0))
            {
                isValid = false;
                err.SetError(comboBoxControl, msgErr);
                comboBoxControl.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// Kiểm tra thông tin rỗng.
        /// </summary>
        /// <param name="txtControl"></param>
        /// <param name="err"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public static bool ValidateChoose(Infragistics.Win.UltraWinEditors.UltraComboEditor comboBoxControl, System.Windows.Forms.ErrorProvider err, string fieldName)
        {
            bool isValid = true;
            string msgErr = "Chưa chọn thông tin '" + fieldName + "'.";

            err.SetError(comboBoxControl, "");

            if (comboBoxControl.SelectedIndex == -1
                || (comboBoxControl.SelectedIndex == 0 && comboBoxControl.Text.Contains("-")))
            {
                isValid = false;
                err.SetError(comboBoxControl, msgErr);
                comboBoxControl.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// Kiểm tra thông tin > 0.
        /// </summary>
        /// <param name="txtControl"></param>
        /// <param name="err"></param>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public static bool ValidateZero(Infragistics.Win.UltraWinEditors.UltraNumericEditor numericUpDownControl, System.Windows.Forms.ErrorProvider err, string fieldName)
        {
            bool isValid = true;
            string msgErr = "Thông tin '" + fieldName + "' phải > 0.";

            err.SetError(numericUpDownControl, "");

            if (numericUpDownControl.Value == null || (numericUpDownControl.Value != null && System.Convert.ToDecimal(numericUpDownControl.Value) == 0))
            {
                isValid = false;
                err.SetError(numericUpDownControl, msgErr);
                numericUpDownControl.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// So sánh giá trị.
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="err"></param>
        /// <param name="fieldNameStart"></param>
        /// <param name="fieldNameEnd"></param>
        /// <returns></returns>
        public static bool ValidateCompare(Infragistics.Win.UltraWinEditors.UltraNumericEditor start, Infragistics.Win.UltraWinEditors.UltraNumericEditor end, System.Windows.Forms.ErrorProvider err, string fieldNameStart, string fieldNameEnd)
        {
            bool isValid = true;
            string msgErr = "Giá trị  '" + fieldNameStart + "' > '" + fieldNameEnd + "', không hợp lệ.";

            err.SetError(start, "");
            err.SetError(end, "");

            if (System.Convert.ToDecimal(start.Value) >= System.Convert.ToDecimal(end.Value))
            {
                isValid = false;
                err.SetError(start, msgErr);
                start.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// So sánh giá trị.
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="err"></param>
        /// <param name="fieldNameStart"></param>
        /// <param name="fieldNameEnd"></param>
        /// <returns></returns>
        public static bool ValidateCompare(Infragistics.Win.UltraWinEditors.UltraDateTimeEditor start, Infragistics.Win.UltraWinEditors.UltraDateTimeEditor end, System.Windows.Forms.ErrorProvider err, string fieldNameStart, string fieldNameEnd)
        {
            bool isValid = true;
            string msgErr = "Giá trị  '" + fieldNameStart + "' > '" + fieldNameEnd + "', không hợp lệ.";

            err.SetError(start, "");
            err.SetError(end, "");

            if (Convert.ToDateTime(start.Value) > Convert.ToDateTime(end.Value))
            {
                isValid = false;
                err.SetError(start, msgErr);
                start.Focus();
            }

            return isValid;
        }
        /// <summary>
        /// Kiểm tra độ dài ký tự cho phép.
        /// </summary>
        /// <param name="valueString"></param>
        /// <param name="lengthLimit"></param>
        /// <returns></returns>
        public static bool ValidateLength(Infragistics.Win.UltraWinEditors.UltraTextEditor textBoxControl, System.Windows.Forms.ErrorProvider err, string fieldName, int lengthLimit)
        {
            bool isValid = true;

            string msgErr = "Thông tin '" + fieldName + "' đã vượt quá độ dài cho phép. Độ dài quy định: " + lengthLimit + " ký tự.";

            err.SetError(textBoxControl, "");
            if (textBoxControl.Text.Trim().Length >= lengthLimit)
            {
                isValid = false;
                err.SetError(textBoxControl, msgErr);
                textBoxControl.Focus();
            }
            return isValid;
        }
    }

    public class CommonApplicationData
    {
        private string applicationFolder;
        private string companyFolder;
        private static readonly string directory = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

        /// <summary>
        /// Creates a new instance of this class creating the specified company and application folders
        /// if they don't already exist and optionally allows write/modify to all users.
        /// </summary>
        /// <param name="companyFolder">The name of the company's folder (normally the company name).</param>
        /// <param name="applicationFolder">The name of the application's folder (normally the application name).</param>
        /// <remarks>If the application folder already exists then permissions if requested are NOT altered.</remarks>
        public CommonApplicationData(string companyFolder, string applicationFolder)
            : this(companyFolder, applicationFolder, false)
        { }
        /// <summary>
        /// Creates a new instance of this class creating the specified company and application folders
        /// if they don't already exist and optionally allows write/modify to all users.
        /// </summary>
        /// <param name="companyFolder">The name of the company's folder (normally the company name).</param>
        /// <param name="applicationFolder">The name of the application's folder (normally the application name).</param>
        /// <param name="allUsers">true to allow write/modify to all users; otherwise, false.</param>
        /// <remarks>If the application folder already exists then permissions if requested are NOT altered.</remarks>
        public CommonApplicationData(string companyFolder, string applicationFolder, bool allUsers)
        {
            this.applicationFolder = applicationFolder;
            this.companyFolder = companyFolder;
            CreateFolders(allUsers);
        }

        /// <summary>
        /// Gets the path of the application's data folder.
        /// </summary>
        public string ApplicationFolderPath
        {
            get { return Path.Combine(CompanyFolderPath, applicationFolder); }
        }
        /// <summary>
        /// Gets the path of the company's data folder.
        /// </summary>
        public string CompanyFolderPath
        {
            get { return Path.Combine(directory, companyFolder); }
        }

        private void CreateFolders(bool allUsers)
        {
            DirectoryInfo directoryInfo;
            DirectorySecurity directorySecurity;
            AccessRule rule;
            SecurityIdentifier securityIdentifier = new SecurityIdentifier
                (WellKnownSidType.AuthenticatedUserSid, null);

            if (!Directory.Exists(CompanyFolderPath))
            {
                directoryInfo = Directory.CreateDirectory(CompanyFolderPath);
                bool modified;
                directorySecurity = directoryInfo.GetAccessControl();
                rule = new FileSystemAccessRule(
                        securityIdentifier,
                        FileSystemRights.FullControl |
                        FileSystemRights.Read |
                        FileSystemRights.ReadData |
                        FileSystemRights.Write |
                        FileSystemRights.WriteData |
                        FileSystemRights.ReadAndExecute |
                        FileSystemRights.Modify,
                        InheritanceFlags.ContainerInherit |
                        InheritanceFlags.ObjectInherit,
                        PropagationFlags.InheritOnly,
                        AccessControlType.Allow);
                directorySecurity.ModifyAccessRule(AccessControlModification.Add, rule, out modified);
                directoryInfo.SetAccessControl(directorySecurity);
            }
            if (!Directory.Exists(ApplicationFolderPath))
            {
                directoryInfo = Directory.CreateDirectory(ApplicationFolderPath);
                if (allUsers)
                {
                    bool modified;
                    directorySecurity = directoryInfo.GetAccessControl();
                    rule = new FileSystemAccessRule(
                        securityIdentifier,
                        FileSystemRights.FullControl |
                        FileSystemRights.Read |
                        FileSystemRights.ReadData |
                        FileSystemRights.Write |
                        FileSystemRights.WriteData |
                        FileSystemRights.ReadAndExecute |
                        FileSystemRights.Modify,
                        InheritanceFlags.ContainerInherit |
                        InheritanceFlags.ObjectInherit,
                        PropagationFlags.InheritOnly,
                        AccessControlType.Allow);
                    directorySecurity.ModifyAccessRule(AccessControlModification.Add, rule, out modified);
                    directoryInfo.SetAccessControl(directorySecurity);
                }
            }
        }

        /// <summary>
        /// Returns the path of the application's data folder.
        /// </summary>
        /// <returns>The path of the application's data folder.</returns>
        public override string ToString()
        {
            return ApplicationFolderPath;
        }
    }

    public class SQL
    {
        //public static Microsoft.SqlServer.Management.Smo.Server server;
        static SqlConnection sqlConnection = new SqlConnection();
        /// <summary>
        /// Initializes the field 'server'
        /// </summary>
        public static void InitializeServer()
        {
            // To Connect to our SQL Server - we Can use the Connection from the System.Data.SqlClient Namespace.
            SqlConnection sqlConnection = new SqlConnection(@"Integrated Security=SSPI; Data Source=" + Global.DATABASE_INSTANCE_DEFAULT);

            //build a "serverConnection" with the information of the "sqlConnection"
            //Microsoft.SqlServer.Management.Common.ServerConnection serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection);

            //The "serverConnection is used in the ctor of the Server.
            //server = new Server(serverConnection);
        }

        /// <summary>
        /// Initializes the field 'server'
        /// </summary>
        public static void InitializeServer(string sqlConnectionString)
        {
            // To Connect to our SQL Server - we Can use the Connection from the System.Data.SqlClient Namespace.
            sqlConnection = new SqlConnection(sqlConnectionString);

            //build a "serverConnection" with the information of the "sqlConnection"
            //Microsoft.SqlServer.Management.Common.ServerConnection serverConnection = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection);

            //The "serverConnection is used in the ctor of the Server.
            //server = new Server(serverConnection);
        }

        private static void SearchFile(string[] paras, string[] files)
        {
            foreach (string item in files)
            {
                if (Path.GetExtension(item).ToLower() == ".mdf")
                {
                    paras[0] = item;
                }
                else if (Path.GetExtension(item).ToLower() == ".ldf")
                {
                    paras[1] = item;
                }
                if (paras[0] != string.Empty && paras[1] != string.Empty)
                    break;
            }
        }

        public static bool Execute_SQLScript(string serverName, string dbName, string dbUser, string dbPassWord, string fileName, out string error)
        {
            try
            {
                if (!System.IO.File.Exists("osql.exe"))
                {
                    Logger.LocalLogger.Instance().WriteMessage(new Exception("Thiếu tệp tin OSQL.exe"));
                    throw new Exception("Thiếu tệp tin OSQL.exe");
                }

                #region Update theo Osql

                if (!Directory.Exists(System.AppDomain.CurrentDomain.BaseDirectory + "Data\\Update\\LogUpdate"))
                    Directory.CreateDirectory(System.AppDomain.CurrentDomain.BaseDirectory + "Data\\Update\\LogUpdate");

                string sfmtArgs = string.Format(@"-S {0} -U {1} -P {2} -d {3} -i ""{4}"" -o ""Data\Update\LogUpdate\{5}.log""", new object[] { serverName, dbUser, dbPassWord, dbName, fileName, Path.GetFileNameWithoutExtension(fileName) });
                System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("Osql.exe", sfmtArgs);
                psi.CreateNoWindow = true;
                psi.ErrorDialog = true;
                psi.UseShellExecute = false;
                System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
                p.WaitForExit();

                error = "";

                return true;

                #endregion
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage(ex);
                error = ex.Message;
                return false;
            }
        }

        public static string GetFolderDatabaseRemote(string serverName, string dbName, string dbUser, string dbPassWord)
        {
            if (string.IsNullOrEmpty(serverName) || string.IsNullOrEmpty(dbName) || string.IsNullOrEmpty(dbUser))
                return "";
            else
            {
                string folderRemote = "";
                try
                {
                    using (SqlConnection cnn = new SqlConnection())
                    {
                        cnn.ConnectionString = string.Format("Server={0};Database={1};Uid={2};Pwd={3};Connect Timeout={4}", new object[] { serverName, dbName, dbUser, dbPassWord, Global.TIME_BACKUP * 60 }); //TIME_BACKUP = phút * 60 giây.
                        cnn.Open();
                        string cmdText = @"
			                                --Default backup database
                                            --Created 09-2012
                                            --Modified 09-2012
                                            --Backup database at folder data *.mdf with format dbName_yyyy_MM_dd.bak
                                            BEGIN

                                            DECLARE @filedata  AS NVARCHAR(max)
                                            DECLARE @filename  AS NVARCHAR(max)
                                            DECLARE @dir  AS NVARCHAR(max)
                                            DECLARE @dbName AS NVARCHAR(255)

                                            SET @filedata=(
                                            SELECT TOP(1) 	filename
                                                from sysfiles
                                                order by fileid)
                                            SET @dbName = (select TOP(1) name from sys.sysdatabases  WHERE filename=@filedata)
                                            SET @filename =
                                            LTRIM(
                                              RTRIM(
                                               REVERSE(
                                                SUBSTRING(
                                                 REVERSE(@filedata),
                                                 0,
                                                 CHARINDEX('\', REVERSE(@filedata),0)
                                                )
                                               )
                                              )
                                             )
                                            SET @dir = REPLACE(@filedata,@filename,'')
                                            
                                            Select @dir

                                            END
                                         ";
                        SqlCommand sqlCmd = new SqlCommand(cmdText);
                        sqlCmd.CommandType = CommandType.Text;
                        sqlCmd.Connection = cnn;
                        folderRemote = (string)sqlCmd.ExecuteScalar();
                    }
                }
                catch (Exception ex)
                {
                    Logger.LocalLogger.Instance().WriteMessage(ex);
                    throw ex;
                }

                return folderRemote;
            }
        }

        /// <summary>
        /// Tao CSDL tu file du lieu da co - Attach database file (.mdf)
        /// </summary>
        /// <param name="serverName">Server (Mac dinh: .\ECSExpress)</param>
        /// <param name="dbName">Ten CSDL (Mac dinh theo mau: ECS_TQDT_KD_V4)</param>
        /// <param name="dbUser">Ten dang nhap (Mac dinh: sa)</param>
        /// <param name="dbPassWord">Mat khau (Mac dinh: 123456)</param>
        /// <param name="loaiHinh">Loai hinh: KD, GC, SXXK</param>
        /// <param name="version">Phien ban du lieu: 3, 4</param>
        /// <returns></returns>
        public static bool AttachDatabase(string serverName, string dbName, string dbUser, string dbPassWord)
        {
            bool valid = false;
            try
            {
                string[] paras = new string[3] { string.Empty, string.Empty, string.Empty };
                string[] files = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.mdf", System.IO.SearchOption.AllDirectories);
                SearchFile(paras, files);

                files = System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.ldf", System.IO.SearchOption.AllDirectories);
                SearchFile(paras, files);

                if (paras[0] == string.Empty || paras[1] == string.Empty)
                {
                    MessageBox.Show("Không tìm thấy tệp tin Cơ sở dữ liệu.");
                    valid = false;
                }

                try
                {
                    /******************************************************************
                    //1. Tạo thư mục lưu data (Nếu chưa có): [Ổ đĩa]/SOFTECH/ECS/DATABASE 
                    //2. Kiểm tra tên file data, tên file log vật lý tại thư mục lưu dữ liệu có trùng tên trước khi copy.
                    //   Nếu đã có thì cảnh báo và không thực hiện copy file.
                    //3. Copy file du lieu từ [Thư mục chương trình ECS]\DATA den vi tri thư mục mới: [Ổ đĩa]/SOFTECH/ECS/DATABASE
                    //4. Lấy thông tin đường dẫn mới của file data.
                    *******************************************************************/

                    //Tao cau truc thu muc
                    if (!Global.CreateFolderDatabaseStructure())
                    {
                        MessageBox.Show(string.Format(ThongBao.APPLICATION_ERROR_01Param, "Không thể tạo cấu trúc thư mục lưu Cơ sở dữ liệu"));
                        valid = false;
                    }

                    //1. Duong dan file du lieu trong thu muc /DATA cua chuong trinh
                    string dataFilePathSource = paras[0];
                    string dataLogPathSource = paras[1];
                    System.IO.FileInfo fiData = new FileInfo(dataFilePathSource);
                    System.IO.FileInfo fiDataLog = new FileInfo(dataLogPathSource);

                    //Duong dan thu muc luu database moi
                    string folderData = (Global.PATH_DRIVER_NAME + Global.PATH_FOLDER_DATABASE);
                    string dataFilePathDestinate = folderData + "\\" + fiData.Name;
                    string dataLogPathDestinate = folderData + "\\" + fiDataLog.Name;

                    //2.
                    if (System.IO.File.Exists(dataFilePathDestinate))
                    {
                        //MessageBoxControlV.ShowMessage("Đã tồn tại 1 file Cơ sở dữ liệu tên '" + fiData.Name + "', không thể tạo mới dữ liệu.\r\n\nBạn vui lòng kiểm tra lại.", false);
                        //return false;
                        dataFilePathDestinate = Global.ChangeFileName(dataFilePathDestinate);
                    }

                    if (System.IO.File.Exists(dataLogPathDestinate))
                    {
                        //MessageBoxControlV.ShowMessage("Đã tồn tại 1 file 'LOG' Cơ sở dữ liệu tên '" + fiDataLog.Name + "', không thể tạo mới dữ liệu.\r\n\nBạn vui lòng kiểm tra lại.", false);
                        //return false;
                        dataLogPathDestinate = Global.ChangeFileName(dataLogPathDestinate);
                    }

                    //Copy file data
                    System.IO.File.Copy(dataFilePathSource, dataFilePathDestinate);
                    System.IO.File.Copy(dataLogPathSource, dataLogPathDestinate);

                    paras[0] = dataFilePathDestinate;
                    paras[1] = dataLogPathDestinate;

                    //ATTACH FILE DATABASE----------------------------------

                    paras[2] = dbName;

                    using (SqlConnection cnn = new SqlConnection())
                    {
                        //Thiet lap thong tin mac dinh ket noi
                        serverName = Global.DATABASE_INSTANCE_DEFAULT;
                        dbUser = Global.DATABASE_USER_DEFAULT;
                        dbPassWord = Global.DATABASE_PASS_DEFAULT;

                        cnn.ConnectionString = string.Format("Server={0};Database={1};Uid={2};Pwd={3};Connect Timeout={4}", new object[] { serverName, "master", dbUser, dbPassWord, Global.TIME_BACKUP * 60 }); //TimeoutBackup = phút * 60 giây.
                        cnn.Open();
                        string sfmtCreateData = string.Format(@"
                                                                    CREATE DATABASE [{0}] ON 
                                                                    ( FILENAME = N'{1}' ),
                                                                    ( FILENAME = N'{2}' )
                                                                     FOR ATTACH
                                                                    ", new object[]{paras[2],paras[0],paras[1]                                                                     
                                                                 });
                        SqlCommand sqlCmd = new SqlCommand(sfmtCreateData);
                        sqlCmd.CommandType = CommandType.Text;
                        sqlCmd.Connection = cnn;
                        sqlCmd.ExecuteNonQuery();
                        valid = true;
                    }

                    System.Xml.XmlDocument docApp = new System.Xml.XmlDocument();

                    string cfgName = string.Empty;

                    if (File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + Global.APPLICATION_NAME + ".exe.Config"))
                        cfgName = AppDomain.CurrentDomain.BaseDirectory + Global.APPLICATION_NAME + ".exe.Config";

                    if (cfgName != string.Empty)
                    {
                        docApp.Load(cfgName);
                        XmlNode nodeCnn = docApp.SelectSingleNode("configuration/connectionStrings/add[@name=\"MSSQL\"]");
                        if (nodeCnn != null/* && !string.IsNullOrEmpty(nodeCnn.Attributes["name"].Value) && nodeCnn.Attributes["name"].Value.ToUpper() == "MSSQL"*/)
                        {
                            nodeCnn.Attributes["connectionString"].Value = string.Format("Server={0};Database={1};Uid={2};Pwd={3}", new object[] { serverName, dbName, dbUser, dbPassWord });
                        }
                        docApp.Save(cfgName);
                    }

                    //Sau khi luu cau hinh ket noi, kiem tra lai ket noi den CSDL moi tao
                    //System.Threading.Thread.Sleep(500);
                    //valid = SQL.TestConnection(string.Format("Server={0};Database={1};Uid={2};Pwd={3}", new object[] { serverName, dbName, dbUser, dbPassWord }));
                    //if (!valid)
                    //{
                    //    Logger.LocalLogger.Instance().WriteMessage("Đã tạo Cơ sở dữ liệu, nhưng kết nối không thành công.", new Exception(""));
                    //    //MessageBoxControlV.ShowMessage("Đã tạo Cơ sở dữ liệu, nhưng kết nối không thành công. Xin vui lòng kiểm tra lại thông tin.\r\n\nBạn có thể liên hệ nhà cung cấp phần mềm để được hướng dẫn.", false);
                    //}
                }
                catch (Exception ex)
                {
                    if (ex.Message.Contains("Access is denied"))
                    {
                        MessageBox.Show("Không có quyền truy cập/ ghi file dữ liệu.\r\n\nXin vui lòng kiểm tra lại phân quyền cho phép ghi file trên thư mục của chương trình.");
                    }
                    else
                        MessageBox.Show(ex.Message);
                    Logger.LocalLogger.Instance().WriteMessage(ex);
                    valid = false;
                }
            }
            catch (Exception ex) { Logger.LocalLogger.Instance().WriteMessage(ex); return false; }

            return valid;
        }

        public static bool TestConnection(string connectionString)
        {
            try
            {
                sqlConnection = new SqlConnection(connectionString);

                sqlConnection.Open();

                sqlConnection.Close();

                return true;
            }
            catch (Exception ex)
            {
                Logger.LocalLogger.Instance().WriteMessage("Kiểm tra kết nối", ex);
            }

            return false;
        }
    }

}
